home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / KEYBOARD.SWG / 0065_Detecting special keys.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  3KB  |  79 lines

  1. (*******************************************************************)
  2.  PROGRAM xKeys;     { test detecting shift/alt/ctrl/sysreq keys     }
  3.                     { Turbo/Quick Pascal  Oct.1992 Greg Vigneault   }
  4.  USES Crt;          { import for ClrScr and KeyPressed              }
  5. {-------------------------------------------------------------------}
  6.  TYPE LockKey = ( RShift,LShift,Ctrl,Alt,Scroll,NumLock,Caps,Insert,
  7.                   RightAlt,LeftAlt,RightCtrl,LeftCtrl,SysReq );
  8.  VAR  KeyByte1 : BYTE Absolute $40:$17; { data maintained by BIOS }
  9.       KeyByte2 : BYTE Absolute $40:$18;
  10.       KeyByte3 : BYTE Absolute $40:$96;
  11. {-------------------------------------------------------------------}
  12.  FUNCTION KeyOn( xkey : LockKey ) : BOOLEAN;   { TRUE if LockKey on }
  13.     BEGIN
  14.     CASE xkey OF
  15.      RShift..Insert : KeyOn:=BOOLEAN( KeyByte1 SHR ORD(xkey) AND 1);
  16.      RightAlt       : KeyOn:=BOOLEAN( KeyByte3 SHR 3 AND 1 );
  17.      LeftAlt        : KeyOn:=BOOLEAN( KeyByte2 SHR 1 AND 1 );
  18.      RightCtrl      : KeyOn:=BOOLEAN( KeyByte3 SHR 2 AND 1 );
  19.      LeftCtrl       : KeyOn:=BOOLEAN( KeyByte2 AND 1 );
  20.      SysReq         : KeyOn:=BOOLEAN( KeyByte2 SHR 2 AND 1 );
  21.     END; {case}
  22.     END;
  23. {-------------------------------------------------------------------}
  24.  FUNCTION Keyboard101 : BOOLEAN;    { TRUE for 101/102-key kybd     }
  25.     BEGIN KeyBoard101 := BOOLEAN( KeyByte3 SHR 4 AND 1 );   END;
  26. {-------------------------------------------------------------------}
  27.  VAR xkey : LockKey;
  28.  BEGIN
  29.     REPEAT  gotoxy(1,1);  WriteLn('Press any of...');
  30.  
  31.     Write('Shifts: ');
  32.     IF KeyOn(LShift) OR KeyOn(RShift)       { either shift down?    }
  33.         THEN BEGIN
  34.                 IF KeyOn(LShift) THEN Write('LEFT ');
  35.                 IF KeyOn(RShift) THEN Write('RIGHT');
  36.                 WriteLn;
  37.              END
  38.         ELSE    WriteLn('none');                    { neither shift }
  39.  
  40.     Write('Controls: ');
  41.     IF KeyOn(Ctrl)                              { either ctrl down? }
  42.         THEN BEGIN
  43.                 IF KeyOn(LeftCtrl)  THEN Write('LEFT ');
  44.                 IF KeyOn(RightCtrl) THEN Write('RIGHT');
  45.                 WriteLn;
  46.              END
  47.         ELSE    WriteLn('none');                    { neither ctrl  }
  48.  
  49.     Write('Alt keys: ');
  50.     IF KeyOn(Alt)                               { either Alt down?  }
  51.         THEN BEGIN
  52.                 IF KeyOn(LeftAlt)  THEN Write('LEFT ');
  53.                 IF KeyON(RightAlt) THEN Write('RIGHT');
  54.                 WriteLn;
  55.              END
  56.         ELSE    WriteLn('none');                    { neither alt   }
  57.  
  58.     FOR xkey := Scroll TO Insert                { check other keys  }
  59.         DO BEGIN
  60.         CASE xkey OF
  61.             Scroll  : Write('Scroll: ');
  62.             NumLock : Write('NumLock: ');
  63.             Caps    : Write('CapsLock: ');
  64.             Insert  : Write('Insert: ');
  65.             END; {case}
  66.         IF KeyOn(xkey) THEN WriteLn('ON') ELSE WriteLn('OFF');
  67.         END;
  68.  
  69.     IF KeyBoard101
  70.         THEN BEGIN
  71.             Write('SysReq: ');
  72.             IF KeyOn(SysReq) THEN WriteLn('ON') ELSE WriteLn('OFF');
  73.         END;
  74.  
  75.     UNTIL KeyPressed;
  76.  
  77.  END {xKeys}.
  78. (*******************************************************************)
  79.